/*****************   CJL_Lib   ********************************
**
** Title  :     c.file
**
*****************************************************************/

#include <string.h>


// from osLib
#include "oslib/os.h"
#include "oslib/fileswitch.h"
#include "oslib/osfile.h"
#include "oslib/osfscontrol.h"
#include "oslib/osargs.h"

// private headers
#include "string.h"
#include "file.h"




/* File system */




fileswitch_object_type CJLfile_object_type ( char * name )
{
  return ( FileL_object_type ( name ) );
}




fileswitch_object_type FileL_object_type ( char * name )
{
  bits load, exec, filetype;
  fileswitch_attr attr;
  int size;
  fileswitch_object_type type;

  type = osfile_read_stamped_no_path ( name, &load, &exec, &size, &attr, &filetype );

  return ( type );
}



osbool CJLfile_object_exists ( char * name )
{
  return ( FileL_object_type ( name ) != osfile_NOT_FOUND ? TRUE : FALSE );
}






osbool FileL_object_exists ( char * name )
{
  return ( FileL_object_type ( name ) != osfile_NOT_FOUND ? TRUE : FALSE );
}




osbool CJLfile_file_exists ( char * name )
{
  return ( FileL_object_type ( name ) == osfile_IS_FILE ? TRUE : FALSE );
}



osbool FileL_file_exists ( char * name )
{
  return ( FileL_object_type ( name ) == osfile_IS_FILE ? TRUE : FALSE );
}





char * CJLfile_leaf ( char * filename )
{
  return (FileL_leaf (filename));
}





char * FileL_leaf ( char * filename )
{
  char * p;

  p = strrchr ( filename, '.' );
  if (!p)
  {
    p = strrchr ( filename, ':' );
    if (!p) p = filename;
    else   p += 1;
  }
  else
  {
    p += 1;
  }
  return (p);
}


/********************************************************************************/

#define FILE_FILEPATH_LENGTH 384

osbool FileL_file_is_open ( char *filename )

{
  os_fw handle;
  char filenames_buffer[FILE_FILEPATH_LENGTH];
  os_error *err = NULL;
  int spare;
  osargs_stream_status status;
  fileswitch_fs_info info;

  /* now go through all file handles to test */
  for (handle = 0; handle < 256; handle++)
  {
    /* first check if file handle is allocated, and only look for filename if it is */
    osargs_read_info (handle, &status, &info);
    if ((status & osargs_STREAM_UNALLOCATED)==0)
    {
      /* first check size of buffer needed */
      err = xosargs_read_pathw (handle, NULL, 0, &spare);
      if (err == NULL)
      {
        /* spare holds (-length) excluding terminator */
        if ((FILE_FILEPATH_LENGTH + spare) < 2 )
        {
          /* buffer is not large enough */
          return(FALSE);
        }

        err = xosargs_read_pathw (handle, filenames_buffer, FILE_FILEPATH_LENGTH, &spare);
        if (err == NULL)
        {
          /* compare the filepaths */
          if ( !strcmp_ignorecase (filenames_buffer, filename) )
          {
            return (TRUE);
          }
        }
      }
    }
  }
  return (FALSE);
}







